AWS CloudShellにプリインストールされるPowerShellモジュールが変更されました

AWS CloudShellにプリインストールされるPowerShellモジュールが変更されました

Clock Icon2023.03.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

本日AWSより以下のアナウンスがあり、AWS CloudShellにプリインストールされているPowerShellモジュールが従来のAWSPowerShell.NetCoreモジュールから、サービス毎のAWS.Tools.*なモジュールに変更されました。

https://aws.amazon.com/about-aws/whats-new/2023/03/aws-cloudshell-modular-variant-aws-tools-powershell/

本記事ではこの更新について解説していきます。

どういうことか?

過去に記事を書きましたが、AWS CloudShellはデフォルトシェルのBash以外にPowerShellも利用可能です。
このCloudShellのPowerShell環境にはこれまでAWS Tools for PowerShellのAWSPowerShell.NetCoreモジュールがプリインストールされていました。

https://dev.classmethod.jp/articles/how-to-remove-awspowershell-netcore-module-in-aws-cloudshell/

ただ、このAWSPowerShell.NetCoreモジュールは公開されるコマンドレット数が多すぎるため自動ロードに失敗する既知の問題があるのと、現在最新のAWS Tools for PowerShell v4系ではこのモジュールではなくAWSサービス毎に分割されたAWS.Tools.*なモジュールを使うことが推奨されています。

今回やっとAWS.Tools.*なモジュールがCloudShellにプリインストールされることになりロードに関する問題が改善されました。

確認してみた

具体的な実装については実際に試しながら確認していきます。
私の検証用AWSアカウントの東京リージョンで試しています。

AWS CloudShellを起動し、そこからさらにPowerShell(pwsh)を起動してインストール済みモジュールの情報を確認すると下図の通りとなりました。

ぱっと見でAWS Tools for PowerShellはどこにもいない様に見えますが、-ListAvailableオプションを付けてコマンドを実行しなおすとAWS.Tools.*なモジュールが全て(本日時点では330モジュール)インストールされていることが分かります。

これらのモジュールは$PSHOME配下の/opt/microsoft/powershell/7/Modules/に保存されており、CloudShell環境の一部となっています。

CloudShell
PS /home/cloudshell-user> dir /opt/microsoft/powershell/7/Modules/                     

    Directory: /opt/microsoft/powershell/7/Modules

UnixMode   User             Group                 LastWriteTime           Size Name
--------   ----             -----                 -------------           ---- ----
drwxr-xr-x root             root                1/13/2023 13:53           1024 AWS.Tools.AccessAnalyzer
drwxr-xr-x root             root                1/13/2023 13:53           1024 AWS.Tools.Account
drwxr-xr-x root             root                1/13/2023 13:53           1024 AWS.Tools.ACMPCA
drwxr-xr-x root             root                1/13/2023 13:53           1024 AWS.Tools.AlexaForBusiness
drwxr-xr-x root             root                1/13/2023 13:53           1024 AWS.Tools.Amplify

・・・(後略)・・・

非常にシンプルな対応で純粋にPowerShell標準のモジュールパスに必要な全モジュールを突っ込んでいるだけでありそれ以外の特別な仕込みはありませんでした。

ただ、これでもモジュール自動ロードの問題は解消されておりImport-Moduleの事前実行無しにAWS Tools for PowerShellの各種コマンドレットを即実行可能です。

(PowerShell起動後いきなりGet-EC2Instanceコマンドを実行しても問題なし)

初回実行時は少し時間がかかるものの、以前の8-10秒よりは遥かに短い時間で済む様になっています。
やっとストレスなくCloudShell上でAWS Tools for PowerShellを使える様になっており非常に良い感じです。

補足1 : コマンドレット実行後にロードされるモジュール

ちなみにこの状態でGet-Moduleコマンドを実行すると以下の様にAWS.Tools.CommonAWS.Tools.EC2とロードされたモジュールだけリストアップされる様になります。

CloudShell
PS /home/cloudshell-user> Get-Module                                                                                               

ModuleType Version    PreRelease Name                                ExportedCommands
---------- -------    ---------- ----                                ----------------
Binary     4.1.249               AWS.Tools.Common                    {Add-AWSLoggingListener, Clear-AWSCredential, Clear-AWSDefaultConfiguration, Clear-AWSHistor…
Binary     4.1.249               AWS.Tools.EC2                       {Add-EC2CapacityReservation, Add-EC2ClassicLinkVpc, Add-EC2InternetGateway, Add-EC2NetworkIn…
Script     0.0                   ImportGuard                         
Manifest   7.0.0.0               Microsoft.PowerShell.Management     {Add-Content, Clear-Content, Clear-Item, Clear-ItemProperty}
Manifest   7.0.0.0               Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object}
Script     2.2.6                 PSReadLine                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLineKeyHandler, Set-PSReadLine

ImportGuardAWS.Tools.Commonの内部モジュールでAWSPowerShell.NetCoreモジュールとのロード競合を防ぐためのものです。

補足2 : AWSPowerShell.NetCoreモジュールのロードエラー

従来のAWSPowerShell.NetCoreモジュールはもう存在しないため、古いPowerShellスクリプトでImport-Module -Name AWSPowerShell.NetCoreを実行している場合はエラーが出ますのでご注意ください。

CloudShell
PS /home/cloudshell-user> Import-Module -Name AWSPowerShell.NetCore
Import-Module: The specified module 'AWSPowerShell.NetCore' was not loaded because no valid module file was found in any module directory.

基本的にImport-Moduleの1行を除外するだけで問題は解決するはずですが、モジュールごとで互換性の方針が若干異なるためAWS.Tools.*なモジュール固有の問題が起きることも少しだけあります。
その場合は適宜スクリプトを修正してください。

余談 : 実は以前のバージョンから問題無かった?

今回の対応はストレートに標準のモジュールパスに全モジュールを突っ込んでいるだけであり、個人的には「これで問題が解決するんだ!?」と結構驚きがあります。

そこでCloudShell以外で、Windows環境で同様のモジュール配置を行ったり古いバージョンのモジュールを配置してみましたが、どちらも問題なくAWS Tools for PowerShellを利用できました。

結果論ではありますが、実は「昔からこの対応していれば何の問題も無かった」気がします。
どうやらAWS.Tools.*なモジュールを大量にインストールした際に起きる問題の根本は全てPowerShellGetにあり、PowerShellGetを介さないインストールであれば問題無かった様です。

すべてのAWS.Tools.*なモジュールをまとめたZipファイルが以下のURLで公開されていますので、全モジュールをまとめてインストールしたい場合はこちらを使うと良いでしょう。

  • 最新バージョン : https://sdk-for-net.amazonwebservices.com/ps/v4/latest/AWS.Tools.zip
  • 個別バージョン : https://sdk-for-net.amazonwebservices.com/ps/releases/AWS.Tools.4.x.y.z.zip

最後に

以上となります。

これで安心してCloudShellでAWS Tools for PowerShellが使えます。
少数派かもしれませんがPowerShell使いにとっては朗報ですね。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.